package model.repositorio;

import java.util.List;
import java.util.Set;

import javax.persistence.Query;

import model.entidades.Usuario;
import model.repositorio.util.ConexaoBD;
import utils.Constantes;

public class UsuarioDAO extends GenericDAOImpl<Usuario>{

	public static String SITUACAO_ATIVOS = Constantes.ATIVO;
	public static String SITUACAO_INATIVOS = Constantes.INATIVO;
	public static String SITUACAO_TODOS = "TODAS";

	public static String TIPO_PROFISSIONAL = Constantes.TIPO_PERFIL_PROFISSIONAL;
	public static String TIPO_OPERADOR = Constantes.TIPO_PERFIL_OPERADOR;
	public static String TIPO_TODOS = "TODOS";

	public UsuarioDAO(){
		setEntityManager( ConexaoBD.getEntityManager() );
	}


	public Usuario buscaPorCPF(String cpf) {
		String hql = "select p from Usuario p where p.cpf = :cpf";
		Query consulta = getEntityManager().createQuery(hql);
		consulta.setParameter("cpf", cpf);
		@SuppressWarnings("unchecked")
		List<Usuario> resultado = consulta.getResultList();
		if (resultado != null && resultado.size() > 0) {
			return resultado.get(0);
		} else {
			return null;
		}
	}

	public Usuario buscaPorLogin(String login) {
		String hql = "select p from Usuario p where (p.login = :login and p.situacao = :situacao)";
		Query consulta = getEntityManager().createQuery(hql);
		consulta.setParameter("login", login);
		consulta.setParameter("situacao", Constantes.ATIVO);
		@SuppressWarnings("unchecked")
		List<Usuario> resultado = consulta.getResultList();
		if (resultado != null && resultado.size() > 0) {
			return resultado.get(0);
		} else {
			return null;
		}
	}

	public List<Usuario> buscaPorParametros(String tipo, String situacao) {

		String hql = "";
		Query consulta = null;
		if (tipo.equalsIgnoreCase(TIPO_TODOS)) {
			if (situacao.equalsIgnoreCase(SITUACAO_TODOS)) {
				hql = "select p from Usuario p where p.tipoPerfil <> :tipo";
				consulta = getEntityManager().createQuery(hql);
				consulta.setParameter("tipo", Constantes.TIPO_PERFIL_ADM);
			} else {
				hql = "select p from Usuario p where (p.situacao = :situacao and p.tipoPerfil <> :tipo)";
				consulta = getEntityManager().createQuery(hql);
				consulta.setParameter("tipo", Constantes.TIPO_PERFIL_ADM);
				consulta.setParameter("situacao", situacao);
			}
		} else {
			if (situacao.equalsIgnoreCase(SITUACAO_TODOS)) {
				hql = "select p from Usuario p where p.tipoPerfil = :tipo";
				consulta = getEntityManager().createQuery(hql);
				consulta.setParameter("tipo", tipo);
			} else {
				hql = "select p from Usuario p where (p.tipoPerfil = :tipo and p.situacao = :situacao)";
				consulta = getEntityManager().createQuery(hql);
				consulta.setParameter("tipo", tipo);
				consulta.setParameter("situacao", situacao);
			}

		}
		
		@SuppressWarnings("unchecked")
		List<Usuario> resultado = consulta.getResultList();
		if (resultado != null && resultado.size() > 0) {
			return resultado;
		} else {
			return null;
		}

	}
	
	public List<Usuario> buscaProfissionaisNaoConveniados(Set<Usuario> listaUsuarios) {
		
		String hql = null;
		Query consulta = null;
		if (listaUsuarios == null || listaUsuarios.size() == 0) {
			hql = "select p from Usuario p where (p.tipoPerfil = :tipoPerfil and p.situacao = :situacao)";
			consulta = getEntityManager().createQuery(hql);
			consulta.setParameter("tipoPerfil", Constantes.TIPO_PERFIL_PROFISSIONAL);
			consulta.setParameter("situacao", Constantes.ATIVO);
		} else {

			hql = "select p from Usuario p where ((p.tipoPerfil = :tipoPerfil and p not in (:listaUsuarios)) and p.situacao = :situacao)";
			consulta = getEntityManager().createQuery(hql);
			consulta.setParameter("tipoPerfil", Constantes.TIPO_PERFIL_PROFISSIONAL);
			consulta.setParameter("listaUsuarios", listaUsuarios);
			consulta.setParameter("situacao", Constantes.ATIVO);
		}
		
		@SuppressWarnings("unchecked")
		List<Usuario> resultado = consulta.getResultList();
		if (resultado != null && resultado.size() > 0) {
			return resultado;
		} else {
			return null;
		}
		
	}

}
